home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / grafica / amhelios / muipreview.cpp < prev    next >
C/C++ Source or Header  |  1999-01-01  |  9KB  |  342 lines

  1. /* -------------------------------------------------------------------------- *\
  2.    MUIPREVIEW.CPP
  3.    Copyright © 1997 by Jarno van der Linden
  4.    jarno@kcbbs.gen.nz
  5.  
  6.    Preview MUI class
  7.  
  8.    This program is Freeware, and all usual Freeware rules apply.
  9.  
  10.    09 Aug 1997: Project started
  11. \* -------------------------------------------------------------------------- */
  12.  
  13. /* -------------------------------- Includes -------------------------------- */
  14. #include <exec/types.h>
  15.  
  16. #include <libraries/mui.h>
  17. #include <utility/utility.h>
  18.  
  19. #include <proto/muimaster.h>
  20. #include <proto/intuition.h>
  21. #include <proto/utility.h>
  22. #include <clib/alib_protos.h>
  23.  
  24. #include <math.h>
  25.  
  26. #include "MUIpreview.h"
  27.  
  28. #include "syn_cam.h"
  29.  
  30. /* ------------------------------ Definitions ------------------------------- */
  31.  
  32. /* --------------------------------- Macros --------------------------------- */
  33.  
  34. /* -------------------------------- Typedefs -------------------------------- */
  35.  
  36. /* ------------------------------ Proto Types ------------------------------- */
  37. __saveds ULONG PreviewNew(struct IClass *cl,Object *obj,Msg msg);
  38. __saveds ULONG PreviewSetup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg);
  39. __saveds ULONG PreviewCleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg);
  40. __saveds ULONG PreviewSet(struct IClass *cl,Object *obj,Msg msg,BOOL nosuper);
  41. __saveds ULONG PreviewGet(struct IClass *cl,Object *obj,Msg msg);
  42. __saveds ULONG PreviewAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg);
  43. __saveds ULONG PreviewDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg);
  44. __saveds ULONG PreviewHandleInput(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg);
  45. __saveds ULONG PreviewUpdate(struct IClass *cl,Object *obj);
  46. __saveds __asm ULONG PreviewDispatcher(register __a0 struct IClass *cl,register __a2 Object *obj,register __a1 Msg msg);
  47.  
  48. /* -------------------------------- Structs --------------------------------- */
  49. struct PreviewData
  50. {
  51.     ULONG mode;
  52.     SynCamera *camera;
  53.     Environ *environ;
  54.     int sx,sy,x,y;
  55.     BOOL moving;
  56.     int level;
  57. };
  58.  
  59. /* -------------------------------- Globals --------------------------------- */
  60. struct MUI_CustomClass *previewClass = NULL;
  61.  
  62. /* ---------------------------------- Code ---------------------------------- */
  63. __saveds ULONG PreviewNew(struct IClass *cl,Object *obj,Msg msg)
  64. {
  65.     struct PreviewData *data;
  66.  
  67.     if(!(obj = (Object *)DoSuperMethodA(cl,obj,msg)))
  68.         return 0;
  69.  
  70.     data = (PreviewData *)INST_DATA(cl,obj);
  71.     data->mode = PREVIEW_STATIC | PREVIEW_MOVEFOCUS | PREVIEW_MOVEX | PREVIEW_MOVEY;
  72.     data->camera = NULL;
  73.     data->environ = NULL;
  74.     data->moving = FALSE;
  75.     data->level = 0;
  76.  
  77.     PreviewSet(cl,obj,msg,TRUE);
  78.  
  79.     return((ULONG)obj);
  80. }
  81.  
  82.  
  83. __saveds ULONG PreviewSetup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  84. {
  85.     if(!(DoSuperMethodA(cl,obj,(Msg)msg)))
  86.         return(FALSE);
  87.  
  88.     MUI_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS);
  89.  
  90.     return(TRUE);
  91. }
  92.  
  93.  
  94. __saveds ULONG PreviewCleanup(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  95. {
  96.     MUI_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS);
  97.     return(DoSuperMethodA(cl,obj,(Msg)msg));
  98. }
  99.  
  100.  
  101. __saveds ULONG PreviewSet(struct IClass *cl,Object *obj,Msg msg,BOOL nosuper)
  102. {
  103.     struct PreviewData *data = (struct PreviewData *)INST_DATA(cl,obj);
  104.     struct TagItem *tags,*tag;
  105.  
  106.     for (tags=((struct opSet *)msg)->ops_AttrList;tag=NextTagItem(&tags);)
  107.     {
  108.         switch (tag->ti_Tag)
  109.         {
  110.             case MUIA_Preview_Mode:
  111.                     data->mode = (ULONG)tag->ti_Data;
  112.                 break;
  113.             case MUIA_Preview_Mode_Add:
  114.                     data->mode |= (ULONG)tag->ti_Data;
  115.                 break;
  116.             case MUIA_Preview_Mode_Remove:
  117.                     data->mode &= ~(ULONG)tag->ti_Data;
  118.                 break;
  119.             case MUIA_Preview_Mode_Toggle:
  120.                     data->mode ^= (ULONG)tag->ti_Data;
  121.                 break;
  122.             case MUIA_Preview_Camera:
  123.                 if (tag->ti_Data)
  124.                 {
  125.                     data->camera = (SynCamera *)tag->ti_Data;
  126.                 }
  127.                 break;
  128.             case MUIA_Preview_Environ:
  129.                 if (tag->ti_Data)
  130.                 {
  131.                     data->environ = (Environ *)tag->ti_Data;
  132.                 }
  133.                 break;
  134.             case MUIA_Preview_Level:
  135.                     data->level = (int)tag->ti_Data;
  136.                 break;
  137.         }
  138.     }
  139.  
  140.     return(nosuper ? 0 : DoSuperMethodA(cl,obj,msg));
  141. }
  142.  
  143.  
  144. __saveds ULONG PreviewGet(struct IClass *cl,Object *obj,Msg msg)
  145. {
  146.     struct PreviewData *data = (struct PreviewData *)INST_DATA(cl,obj);
  147.     ULONG *store = ((struct opGet *)msg)->opg_Storage;
  148.  
  149.     switch (((struct opGet *)msg)->opg_AttrID)
  150.     {
  151.         case MUIA_Preview_Mode   : *store = (ULONG)data->mode; return(TRUE);
  152.         case MUIA_Preview_Camera : *store = (ULONG)data->camera; return(TRUE);
  153.         case MUIA_Preview_Environ: *store = (ULONG)data->environ; return(TRUE);
  154.         case MUIA_Preview_Level  : *store = (ULONG)data->level; return(TRUE);
  155.     }
  156.  
  157.     return(DoSuperMethodA(cl,obj,msg));
  158. }
  159.  
  160.  
  161. __saveds ULONG PreviewAskMinMax(struct IClass *cl,Object *obj,struct MUIP_AskMinMax *msg)
  162. {
  163.     DoSuperMethodA(cl,obj,(Msg)msg);
  164.  
  165.     msg->MinMaxInfo->MinWidth  += 300;
  166.     msg->MinMaxInfo->DefWidth  += 320;
  167.     msg->MinMaxInfo->MaxWidth  += 500;
  168.  
  169.     msg->MinMaxInfo->MinHeight += 300;
  170.     msg->MinMaxInfo->DefHeight += 320;
  171.     msg->MinMaxInfo->MaxHeight += 500;
  172.  
  173.     return(0);
  174. }
  175.  
  176.  
  177. __saveds ULONG PreviewDraw(struct IClass *cl,Object *obj,struct MUIP_Draw *msg)
  178. {
  179.     struct PreviewData *data = (struct PreviewData *)INST_DATA(cl,obj);
  180.     WinMetaFile *winmetafile;
  181.  
  182.     DoSuperMethodA(cl,obj,(Msg)msg);
  183.  
  184.     if (!(msg->flags & MADF_DRAWOBJECT))
  185.         return(0);
  186.  
  187.     winmetafile = new WinMetaFile(_window(obj),_dri(obj),_mleft(obj),_top(obj)+1);
  188.     if(data->moving)
  189.         data->camera->BoxPreview(data->environ, winmetafile, data->level);
  190.     else
  191.         data->camera->Preview(data->environ, winmetafile);
  192.     delete winmetafile;
  193.  
  194.     return(0);
  195. }
  196.  
  197.  
  198. __saveds void MoveCamera(struct IClass *cl,Object *obj)
  199. {
  200.     struct PreviewData *data = (struct PreviewData *)INST_DATA(cl,obj);
  201.     double nx,ny,r;
  202.  
  203.     nx = -((double)(data->x))/_mwidth(obj);
  204.     ny = -((double)(data->y))/_mheight(obj);
  205.     r = sqrt(nx*nx+ny*ny);
  206.  
  207.     if(data->mode & PREVIEW_MOVEX)
  208.     {
  209.         if((data->mode & PREVIEW_MOVEEYE) && (data->mode & PREVIEW_MOVEFOCUS))
  210.         {
  211.             data->camera->Pan(nx*10.0,0.0);
  212.         }
  213.         else if(data->mode & PREVIEW_MOVEEYE)
  214.         {
  215.             data->camera->Orbit(nx*2.0*PI,0.0);
  216.         }
  217.         else if(data->mode & PREVIEW_MOVEFOCUS)
  218.         {
  219.             data->camera->Rotate(nx*2.0*PI,0.0);
  220.         }
  221.     }
  222.     if(data->mode & PREVIEW_MOVEY)
  223.     {
  224.         if((data->mode & PREVIEW_MOVEEYE) && (data->mode & PREVIEW_MOVEFOCUS))
  225.         {
  226.             data->camera->Pan(0.0,ny*10.0);
  227.         }
  228.         else if(data->mode & PREVIEW_MOVEEYE)
  229.         {
  230.             data->camera->Orbit(0.0,ny*2.0*PI);
  231.         }
  232.         else if(data->mode & PREVIEW_MOVEFOCUS)
  233.         {
  234.             data->camera->Rotate(0.0,ny*2.0*PI);
  235.         }
  236.     }
  237.     if(data->mode & PREVIEW_MOVEZ)
  238.     {
  239.         if((data->mode & PREVIEW_MOVEEYE) && (data->mode & PREVIEW_MOVEFOCUS))
  240.         {
  241.             data->camera->Dolly(ny*10.0);
  242.         }
  243.         else if(data->mode & PREVIEW_MOVEEYE)
  244.         {
  245.             data->camera->DollyEyeFocusPosn(ny*10.0, 0.0);
  246.         }
  247.         else if(data->mode & PREVIEW_MOVEFOCUS)
  248.         {
  249.             data->camera->DollyEyeFocusPosn(0.0, ny*10.0);
  250.         }
  251.     }
  252.  
  253.     PreviewUpdate(cl,obj);
  254. }
  255.  
  256.  
  257. __saveds ULONG PreviewHandleInput(struct IClass *cl,Object *obj,struct MUIP_HandleInput *msg)
  258. {
  259.     #define _between(a,x,b) ((x)>=(a) && (x)<=(b))
  260.     #define _isinobject(x,y) (_between(_mleft(obj),(x),_mright(obj)) && _between(_mtop(obj),(y),_mbottom(obj)))
  261.  
  262.     struct PreviewData *data = (struct PreviewData *)INST_DATA(cl,obj);
  263.  
  264.     if(msg->imsg)
  265.     {
  266.         switch(msg->imsg->Class)
  267.         {
  268.             case IDCMP_MOUSEBUTTONS:
  269.                 if(msg->imsg->Code == SELECTDOWN)
  270.                 {
  271.                     if(_isinobject(msg->imsg->MouseX,msg->imsg->MouseY))
  272.                     {
  273.                         data->sx = msg->imsg->MouseX;
  274.                         data->sy = msg->imsg->MouseY;
  275.                         data->moving = TRUE;
  276.                         PreviewUpdate(cl,obj);
  277.                         MUI_RequestIDCMP(obj,IDCMP_MOUSEMOVE | IDCMP_DELTAMOVE);
  278.                     }
  279.                 }
  280.                 else
  281.                 {
  282.                     MUI_RejectIDCMP(obj,IDCMP_MOUSEMOVE | IDCMP_DELTAMOVE);
  283.                     if(data->moving == TRUE)
  284.                     {
  285.                         data->moving = FALSE;
  286.                         PreviewUpdate(cl,obj);
  287.                     }
  288.                 }
  289.                 break;
  290.             case IDCMP_MOUSEMOVE:
  291.                 data->x = msg->imsg->MouseX;
  292.                 data->y = msg->imsg->MouseY;
  293.                 MoveCamera(cl,obj);
  294.                 break;
  295.         }
  296.     }
  297.  
  298.     return(DoSuperMethodA(cl,obj,(Msg)msg));
  299. }
  300.  
  301.  
  302. __saveds ULONG PreviewUpdate(struct IClass *cl,Object *obj)
  303. {
  304.     MUI_Redraw(obj,MADF_DRAWOBJECT);
  305.  
  306.     return(0);
  307. }
  308.  
  309.  
  310. __saveds __asm ULONG PreviewDispatcher(register __a0 struct IClass *cl,register __a2 Object *obj,register __a1 Msg msg)
  311. {
  312.     switch (msg->MethodID)
  313.     {
  314.         case OM_NEW             : return(PreviewNew        (cl,obj,msg));
  315.         case MUIM_Setup         : return(PreviewSetup      (cl,obj,(MUIP_HandleInput *)msg));
  316.         case MUIM_Cleanup       : return(PreviewCleanup    (cl,obj,(MUIP_HandleInput *)msg));
  317.         case OM_SET             : return(PreviewSet        (cl,obj,msg,FALSE));
  318.         case OM_GET             : return(PreviewGet        (cl,obj,msg));
  319.         case MUIM_AskMinMax     : return(PreviewAskMinMax  (cl,obj,(MUIP_AskMinMax *)msg));
  320.         case MUIM_Draw          : return(PreviewDraw       (cl,obj,(MUIP_Draw *)msg));
  321.         case MUIM_HandleInput   : return(PreviewHandleInput(cl,obj,(MUIP_HandleInput *)msg));
  322.         case MUIM_Preview_Update: return(PreviewUpdate     (cl,obj));
  323.     }
  324.  
  325.     return(DoSuperMethodA(cl,obj,msg));
  326. }
  327.  
  328.  
  329. struct MUI_CustomClass *InitPreviewClass(void)
  330. {
  331.     previewClass = MUI_CreateCustomClass(NULL,MUIC_Area,NULL,sizeof(struct PreviewData),PreviewDispatcher);
  332.  
  333.     return previewClass;
  334. }
  335.  
  336.  
  337. void DeletePreviewClass(void)
  338. {
  339.     if(previewClass) MUI_DeleteCustomClass(previewClass);
  340.     previewClass = NULL;
  341. }
  342.